/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package manejadores;

import beans.SolicitudRegistro;
import java.sql.*;
import java.util.ArrayList;
import beans2.SolicitudReserva;
import beans2.TipoRecurso;
import beans2.Recurso;
import beans2.Usuario;

/**
 *
 * @author Jose Dario Gimenez
 */
public class ManejadorSolicitudReserva {

    private Connection connection;
    private ResultSet resultSet;
    private ArrayList list;
    private SolicitudReserva solicitudReserva;

    public void setConnection(Connection connection) {
        this.connection = connection;
    }

    public void setSolicitudReserva(SolicitudReserva solicitudReserva) {
        this.solicitudReserva = solicitudReserva;
    }

    public void store() throws SQLException {
        TipoRecurso tipoRecurso = solicitudReserva.getTipoRecurso();
        Recurso recurso = solicitudReserva.getRecurso();
        /*PreparedStatement statement = connection.prepareStatement("insert into solicitudreserva " +
        " (idtiporecurso, idrecurso, ubicacion, personaretiro, fechainicio, " +
        " horainicio, fechafinal, horafinal, observacion, estado, idusuario, idsolicitudreserva) " +
        " values ('" + tipoRecurso.getId() + "','" + recurso.getId()+"','" +
        solicitudReserva.getUbicacion() + "','" + solicitudReserva.getPersonaRetiro() +
        "','" + solicitudReserva.getFechainicio() + "','" + solicitudReserva.getHorainicio() + "','" +
        solicitudReserva.getFechafinal() + "','" + solicitudReserva.getHorafinal() + "','" + 
        solicitudReserva.getObservacion() + "','" + solicitudReserva.getEstado() + "','" + 
        solicitudReserva.getIdusuario()+"', nextval('solicitudreserva_idsolicitudreserva_seq'))");
         * */
        String id = "";

        id = recurso.getId() == -1 ? " NULL " : "'" + String.valueOf(recurso.getId()) + "'";

        String sql = " INSERT INTO solicitudreserva " +
                " SELECT '" + solicitudReserva.getFechainicio() + "', '" + solicitudReserva.getHorainicio() + "', '" +
                solicitudReserva.getFechafinal() + "', '" + solicitudReserva.getHorafinal() + "', '" + solicitudReserva.getEstado() +
                "', '" + solicitudReserva.getObservacion() + "', nextval('solicitudreserva_idsolicitudreserva_seq'), '" +
                solicitudReserva.getUsuario().getId() + "', '" + tipoRecurso.getId() + "'," + id + ",'" + solicitudReserva.getUbicacion() +
                "','" + solicitudReserva.getPersonaRetiro() + "'";
        System.out.println("SQL: " + sql);
        PreparedStatement statement = connection.prepareStatement(sql);
        int cant = statement.executeUpdate();

        System.out.println("Cant. filas: " + cant);
        connection.commit();
    }

    public void setCondition(String condition) throws SQLException {
        if (!condition.equalsIgnoreCase("")) {
            condition = " and " + condition;
        }
        list = new ArrayList();
        PreparedStatement statement = connection.prepareStatement("select idsolicitudreserva, solicitudreserva.idtiporecurso, solicitudreserva.idusuario, fechainicio, horainicio, fechafinal, horafinal, estado, solicitudreserva.observacion, ubicacion, personaretiro, idrecurso, usuario.nombreoperativo, tiporecurso.descripcion from solicitudreserva, usuario, tiporecurso where solicitudreserva.idusuario=usuario.idusuario and solicitudreserva.idtiporecurso=tiporecurso.idtiporecurso " + condition + " order by idsolicitudreserva", ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE, ResultSet.HOLD_CURSORS_OVER_COMMIT);
        resultSet = statement.executeQuery();
        while (resultSet.next()) {
            solicitudReserva = new SolicitudReserva();
            solicitudReserva.setIdsolicitudreserva(resultSet.getInt(1));
            TipoRecurso tipoRecurso = new TipoRecurso();
            tipoRecurso.setId(resultSet.getInt(2));
            Usuario usuario = new Usuario();
            usuario.setId(resultSet.getInt(3));
            solicitudReserva.setFechainicio(resultSet.getString(4));
            solicitudReserva.setHorainicio(resultSet.getString(5));
            solicitudReserva.setFechafinal(resultSet.getString(6));
            solicitudReserva.setHorafinal(resultSet.getString(7));
            solicitudReserva.setEstado(resultSet.getString(8));
            solicitudReserva.setObservacion(resultSet.getString(9));
            solicitudReserva.setUbicacion(resultSet.getString(10));
            solicitudReserva.setPersonaRetiro(resultSet.getString(11));
            ManejadorRecurso manejadorRecurso = new ManejadorRecurso();
            manejadorRecurso.setConnection(connection);
            manejadorRecurso.setCondition("idrecurso=" + resultSet.getInt(12));
            solicitudReserva.setRecurso(manejadorRecurso.getRecurso());
            usuario.setNombreOperativo(resultSet.getString(13));
            solicitudReserva.setUsuario(usuario);
            tipoRecurso.setDescripcion(resultSet.getString(14));
            solicitudReserva.setTipoRecurso(tipoRecurso);
            list.add(solicitudReserva);
        }
    }

    public ArrayList getList() {
        return list;
    }

    public void setIndex(int index) {
        solicitudReserva = (SolicitudReserva) list.get(index);
    }

    public SolicitudReserva getSolicitudReserva() {
        return solicitudReserva;
    }

    public void rechazar() throws SQLException {
        PreparedStatement statement = connection.prepareStatement("update solicitudreserva set estado='R' where idsolicitudreserva=" + solicitudReserva.getIdsolicitudreserva());
        statement.executeUpdate();
        connection.commit();
    }

    public boolean aprobar(int idRecurso, int idUsuario) throws SQLException {
        String str="select * from reserva where idrecurso = " + idRecurso + " and ( ( ( fechainicio < '" + solicitudReserva.getFechainicio() + "' or ( fechainicio = '" + solicitudReserva.getFechainicio() + "' and horainicio < '" + solicitudReserva.getHorainicio() + "') ) and ( fechafinal > '" + solicitudReserva.getFechainicio() + "' or ( fechafinal = '" + solicitudReserva.getFechainicio() + "' and horafinal > '" + solicitudReserva.getHorainicio() + "') ) and ( fechafinal < '" + solicitudReserva.getFechafinal() + "' or ( fechafinal = '" + solicitudReserva.getFechafinal() + "' and horafinal < '" + solicitudReserva.getHorafinal() + "') ) ) or ( ( fechainicio > '" + solicitudReserva.getFechainicio() + "' or ( fechainicio = '" + solicitudReserva.getFechainicio() + "' and horainicio > '" + solicitudReserva.getHorainicio() + "') ) and ( fechainicio < '" + solicitudReserva.getFechafinal() + "' or ( fechainicio = '" + solicitudReserva.getFechafinal() + "' and horainicio < '" + solicitudReserva.getHorafinal() + "') ) and ( fechafinal > '" + solicitudReserva.getFechafinal() + "' or ( fechafinal = '" + solicitudReserva.getFechafinal() + "' and horafinal > '" + solicitudReserva.getHorafinal() + "') ) ) or ( ( fechainicio < '" + solicitudReserva.getFechainicio() + "' or ( fechainicio = '" + solicitudReserva.getFechainicio() + "' and horainicio < '" + solicitudReserva.getHorainicio() + "') ) and ( fechafinal > '" + solicitudReserva.getFechafinal() + "' or ( fechafinal = '" + solicitudReserva.getFechafinal() + "' and horafinal > '" + solicitudReserva.getHorafinal() + "') ) ) or ( ( fechainicio > '" + solicitudReserva.getFechainicio() + " ' or ( fechainicio = ' " + solicitudReserva.getFechainicio() + " ' and horainicio > '" + solicitudReserva.getHorainicio() + " ' )  ) and ( fechafinal < ' " + solicitudReserva.getFechafinal() + " ' or ( fechafinal = ' " + solicitudReserva.getFechafinal() + " ' and horafinal < ' " + solicitudReserva.getHorafinal() + " ' ) ) ) )";
        PreparedStatement statement = connection.prepareStatement(str);
        ResultSet aux = statement.executeQuery();
        if (aux.next())
        {
            return false;
        } else {
            statement = connection.prepareStatement("update solicitudreserva set estado =   'A' where idsolicitudreserva=" + solicitudReserva.getIdsolicitudreserva());
            statement.executeUpdate();
            connection.commit();


            statement = connection.prepareStatement("insert into reserva (idsolicitudreserva, idtiporecurso, idusuario, fechainicio, horainicio, fechafinal, horafinal, estado, observacion, ubicacion, personaretiro, idrecurso, idaprobador)" +
                    "select idsolicitudreserva, idtiporecurso, idusuario, fechainicio, horainicio, fechafinal, horafinal, estado, observacion, ubicacion, personaretiro, " + idRecurso + "," + idUsuario + " from solicitudreserva where idsolicitudreserva=" + solicitudReserva.getIdsolicitudreserva());
            statement.executeUpdate();
            connection.commit();
            return true;
        }
    }
}
